Problema: Predicción de calorías quemadas (Regresión)¶

Utilizando como referencia la tabla sobre actividad física y gasto calórico disponible en la página W3Schools.com, desarrolla un modelo de Machine Learning eficiente para la predicción, aplicando técnicas de análisis y selección de variables relevantes.

Paso 1: Recolección de datos¶

  • Revisar la tabla: Se examinan los datos proporcionados por la página w3schools.com para entender qué variables están disponibles.
  • Identificar la variable objetivo: En este caso, la variable que queremos predecir es el gasto calórico.
In [10]:
# Importar librerias
import pandas as pd
import plotly.io as pio

# Renderirzar graficos de plotly para verlos en el navegador web
pio.renderers.default = 'notebook'

# Leer datos descargados de W3School - Actividzd fisica y gasto calorico
df = pd.read_csv("../data/data_calorias.csv")
print(df)
     Duration  Pulse  Maxpulse  Calories
0          60    110       130     409.1
1          60    117       145     479.0
2          60    103       135     340.0
3          45    109       175     282.4
4          45    117       148     406.0
..        ...    ...       ...       ...
164        60    105       140     290.8
165        60    110       145     300.0
166        60    115       145     310.2
167        75    120       150     320.4
168        75    125       150     330.4

[169 rows x 4 columns]

Paso 2: Exploración de los datos¶

  • Verificar la estructura de la tabla: Usa DataFrame.info() para verificar el número de filas, columnas, tipos de datos y valores nulos.
  • Generar estadísticas: Usa DataFrame.describe() para obtener estadísticas descriptivas de las variables.
In [12]:
print("**! Estructura de la tabla !**")
print(df.info())

print("**! Estadisticas descriptivas !**")
print(df.describe())
**! Estructura de la tabla !**
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 169 entries, 0 to 168
Data columns (total 4 columns):
 #   Column    Non-Null Count  Dtype  
---  ------    --------------  -----  
 0   Duration  169 non-null    int64  
 1   Pulse     169 non-null    int64  
 2   Maxpulse  169 non-null    int64  
 3   Calories  164 non-null    float64
dtypes: float64(1), int64(3)
memory usage: 5.4 KB
None
**! Estadisticas descriptivas !**
         Duration       Pulse    Maxpulse     Calories
count  169.000000  169.000000  169.000000   164.000000
mean    63.846154  107.461538  134.047337   375.790244
std     42.299949   14.510259   16.450434   266.379919
min     15.000000   80.000000  100.000000    50.300000
25%     45.000000  100.000000  124.000000   250.925000
50%     60.000000  105.000000  131.000000   318.600000
75%     60.000000  111.000000  141.000000   387.600000
max    300.000000  159.000000  184.000000  1860.400000

Preguntas clave para explorar los datos y manejo de funcones en Pandas

  1. ¿Cuántas sesiones de ejercicio se han registrado en total?
  2. ¿Cuál es la duración promedio de las sesiones de ejercicio?
  3. ¿Qué tan variable es la quema de calorías entre las sesiones?
  4. ¿Cuál es la sesión de menor y mayor duración registrada?
  5. ¿Cuántas sesiones tienen valores faltantes en la quema de calorías?
In [13]:
# 1. ¿Cuántas sesiones de ejercicio se han registrado en total?
total_sesiones = len(df)
print(f"1. Total de sesiones de ejercicio registradas: {total_sesiones}")

# 2. ¿Cuál es la duración promedio de las sesiones de ejercicio?
duracion_promedio = df["Duration"].mean()
print(f"2. Duración promedio de las sesiones de ejercicio: {duracion_promedio:.2f} minutos")

# 3. ¿Qué tan variable es la quema de calorías entre las sesiones?
variabiidad_calorias = df["Calories"].std()
print(f"3. Variabilidad en la quema de calorías (desviación estándar): {variabiidad_calorias:.2f}")

# 4. ¿Cuál es la sesión de menor y mayor duración registrada?
duracion_min = df["Duration"].min()
duracion_max = df["Duration"].max()
print(f"4.1 Sesión de menor duración: {duracion_min} minutos")
print(f"4.2 Sesión de mayor duración: {duracion_max} minutos")

# 5. ¿Cuántas sesiones tienen valores faltantes en la quema de calorías?
calorias_vacias = df["Calories"].isna().sum()
print(f"5. Sesiones con valores faltantes en calorías: {calorias_vacias}")
1. Total de sesiones de ejercicio registradas: 169
2. Duración promedio de las sesiones de ejercicio: 63.85 minutos
3. Variabilidad en la quema de calorías (desviación estándar): 266.38
4.1 Sesión de menor duración: 15 minutos
4.2 Sesión de mayor duración: 300 minutos
5. Sesiones con valores faltantes en calorías: 5

Paso 3: Procesamiento de los datos¶

  • Limpiar de datos: Manejar valores faltantes (por ejemplo, llenar valores nulos con la media o eliminar filas/columnas), ademas eliminar o manejar datos duplicados.
  • Estandarizar varaibles: Transforma o normaliza los datos en caso de ser necesario.

La variable objetivo (y, en este caso Calories) contiene 5 valores nulos (NaN). Scikit-learn no puede procesar datos faltantes directamente, por lo que es necesario limpiar o manejar estos valores antes de entrenar el modelo.

In [14]:
# Verificar valores nulos
print(f"**! Varaibles con valores nulos: Dataframe original !**\n{df.isna().sum()}")

# Manejar valores nulos en la variable objetivo
df = df.dropna(subset=["Calories"])  # O imputar: df["Calories"].fillna(df["Calories"].mean(), inplace=True)

# Asegúrate de que no haya valores nulos
print(f"**! Varaibles con valores nulos: Dataframe depurado !**\n{df.isna().sum()}")
**! Varaibles con valores nulos: Dataframe original !**
Duration    0
Pulse       0
Maxpulse    0
Calories    5
dtype: int64
**! Varaibles con valores nulos: Dataframe depurado !**
Duration    0
Pulse       0
Maxpulse    0
Calories    0
dtype: int64

Nota: Es posible que algunos registros tengan los mismos valores en Duración, Pulsaciones, Máximo Pulso y Calorías, pero representan diferentes sesiones de ejercicio realizadas por la misma o diferentes personas, por lo tanto no necesariamente deben considerarse duplicados en el sentido de ser un error en los datos.

In [ ]:
# Encontrar duplicados
df_duplicados = df[df.duplicated(keep=False)]

# Ordenar por todas las columnas para agrupar duplicados
df_duplicados = df_duplicados.sort_values(by=df.columns.tolist())

# Mostrar el resultado
print(df_duplicados)

# Exportar duplicados a un archivo Excel
# df_duplicados.to_excel("duplicados.xlsx", index=False)

# Remover todos los duplicados
# df.drop_duplicates(inplace = True)
# print(df)

Paso 4: Análisis de las variables¶

  • Explorar correlaciones: Calcula las correlaciones entre las variables numericas con DataFrame.corr() para identificar relaciones importantes. Esto tambien es importante para detectar multicolinealidad.
  • Visualizar los datos: Utiliza gráficos como heatmap para representar gráficamente las relaciones entre variables y diagramas de dispersión para analizar relaciones clave.
In [15]:
# Tabala de correlación entre variables
corr_matrix = df.corr()
print(corr_matrix)
          Duration     Pulse  Maxpulse  Calories
Duration  1.000000 -0.160661  0.005679  0.922717
Pulse    -0.160661  1.000000  0.784631  0.025121
Maxpulse  0.005679  0.784631  1.000000  0.203813
Calories  0.922717  0.025121  0.203813  1.000000
In [16]:
import plotly.express as px

# Crear el heatmap de correlación
fig = px.imshow(corr_matrix, text_auto=True, color_continuous_scale='Blues', title="Heatmap de Correlación")
fig.show()
In [17]:
import plotly.express as px

# Crear el gráfico de dispersión múltiple
fig = px.scatter_matrix(df, 
                        dimensions=["Duration", "Pulse", "Maxpulse", "Calories"],color="Calories",
                        title="Matriz de Dispersión entre Variables")
fig.update_traces(diagonal_visible=False)  # Ocultar los gráficos de la diagonal
fig.show()

Paso 5: Selección de variables relevantes¶

  • Seleccionar variables: Basado en las correlaciones y visualizaciones, se seleccionan las variables predictoras más relevantes para explicar la quema de calorías.

Correlación entre Calories y las demás variables:

  • Duration: Tiene una correlación muy fuerte (0.9227) con la quema de calorías. Esto indica que la duración del ejercicio es un factor clave y debería ser la variable principal en el modelo predictivo.
  • Pulse: Tiene una correlación muy baja (0.0251) con las calorías quemadas. Esto sugiere que las pulsaciones no son un buen predictor directo para la quema de calorías, por lo tanto no sera tendia en cuenta.
  • Maxpulse: La correlación es débil (0.2038) pero mayor que la de Pulse. Aunque no es tan determinante como Duration, podría aportar algo de información adicional.

Paso 6: Construcción del modelo¶

  • Dividir los datos: Los datos se dividen en conjuntos de entrenamiento y prueba, comunmente (80%-20%).
  • Seleccionar el modelo: Dado que tanto la variable objetivo como las predictoras son cuantitativas, se utilizará un modelo de regresión lineal para predecir las calorías quemadas. Las calorías, al ser una variable cuantitativa (es decir, un valor numérico continuo que puede asumir cualquier valor dentro de un rango), hacen que un Modelo de Regresión Lineal sea una elección adecuada para este análisis.
  • Entrenar el modelo: Permite ajustar el modelo con los datos de entrenamiento y las variables seleccionadas.
  • Evaluar el modelo: Calcular métricas de desempeño como:
    • Error Cuadrático Medio (MSE): Mide la diferencia promedio entre los valores predichos por el modelo y los valores reales. Cuanto menor sea el MSE, mejor será el desempeño del modelo.
    • R² (coeficiente de determinación): Indica el porcentaje de la variabilidad total de la variable dependiente. Su valor oscila entre 0 y 1. Un R² más alto sugiere un mejor ajuste del modelo a los datos.
  • Predecir valores: Mostramos cómo predecir calorías para una nueva entrada.

Comenzaremos con un Modelo de Regresión Lineal Simple para evaluar la relación entre una de las variables predictoras, como la Duración del ejercicio, y las Calorías quemadas. Este modelo nos permitirá entender de manera inicial cómo una sola variable puede predecir la variable objetivo. Posteriormente, avanzaremos a un Modelo de Regresión Lineal Múltiple, en el cual incorporaremos variables predictoras como Duración y Máximo Pulso. Este enfoque nos ayudará a seleccionar el modelo más adecuado y preciso para la predicción.

Modelo de Regresion Lineal Simple

In [19]:
# Importar librerias
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score

# Usamos solo Duration como variable predictora
X_simple = df[["Duration"]]
y = df["Calories"]

# Dividir los datos en conjuntos de entrenamiento y prueba
X_train, X_test, y_train, y_test = train_test_split(X_simple, y, test_size=0.2, random_state=42)

# Crear y entrenar el modelo de regresión simple
model = LinearRegression()
model.fit(X_train, y_train)

# Realizar predicciones
y_pred = model.predict(X_test)

# Evaluar el modelo
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print("Coeficiente del modelo:", model.coef_)
print("Intercepto del modelo:", model.intercept_)
print("Error cuadrático medio (MSE):", mse)
print("R² del modelo:", r2)

# Ejemplo de predicción
new_data = pd.DataFrame({"Duration": [70]})
calories_pred = model.predict(new_data)
print("Calorías predichas:", calories_pred)
Coeficiente del modelo: [5.75538402]
Intercepto del modelo: 5.229634541828489
Error cuadrático medio (MSE): 8245.553232781873
R² del modelo: 0.7471444773251994
Calorías predichas: [408.10651579]

Interpretación del modelo

  • Coeficiente del modelo: Indica que, por cada unidad adicional de Duración, las Calorias aumentarán en 5.76.
  • Intercepto del modelo: Es el valor estimado de las calorías quemadas cuando la Duración es cero. Esto significa que, si alguien no realiza ejercicio (duración de 0 minutos), el modelo predice que quemará aproximadamente 5.23 calorías.
  • Error cuadrático medio (MSE): El valor de 8245.55 relativamente alto sugiere que el modelo tiene un nivel significativo de error en las predicciones. Cuanto menor sea el MSE, mejor se ajusta el modelo, por lo que podría ser útil considerar otros modelos para reducir este error.
  • R² (Coeficiente de determinación): El R² de 0.7471 indica que 74.71% de la variabilidad en las calorías quemadas puede ser explicada por la Duración del ejercicio.
  • Calorías predichas: La predicción de 408.11 calorías es el valor estimado de las calorías quemadas basado en el modelo para los valores de Duración proporcionados.

Modelo de Regresion Lineal Multiple¶

In [20]:
# Importar librerias
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score

# Seleccionar las variables predictoras y la variable objetivo
X = df[["Duration", "Maxpulse"]]  # Variables predictoras
y = df["Calories"]  # Variable objetivo

# Dividir los datos en conjuntos de entrenamiento y prueba
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Crear y entrenar el modelo de regresión lineal
model = LinearRegression()
model.fit(X_train, y_train)

# Realizar predicciones
y_pred = model.predict(X_test)

# Evaluar el modelo
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print("Coeficientes del modelo:", model.coef_)
print("Intercepto del modelo:", model.intercept_)
print("Error cuadrático medio (MSE):", mse)
print("R² del modelo:", r2)

# Ejemplo de predicción
new_data = pd.DataFrame({"Duration": [70], "Maxpulse": [140]})
calories_pred = model.predict(new_data)
print("Calorías predichas:", calories_pred)
Coeficientes del modelo: [5.71057461 2.99381171]
Intercepto del modelo: -393.44345667081967
Error cuadrático medio (MSE): 3558.03410518467
R² del modelo: 0.8908904535617549
Calorías predichas: [425.43040575]

Interpretación del modelo

  • Coeficiente del modelo: Los coeficientes parecen razonables, indicando que ambas variables (Duration y Maxpulse) tienen un impacto positivo sobre las calorías.
    • Si aumentamos Duration en 1 unidad, las Calories aumentarán en 5.71, manteniendo Maxpulse constante.
    • Si aumentamos Maxpulse en 1 unidad, las Calories aumentarán en 2.99, manteniendo Duration constante.
  • Intercepto del modelo: El valor negativo del intercepto es común en algunos modelos, pero en este contexto puede no tener mucho sentido físico. A menudo se interpreta solo como un valor matemático.
  • Error cuadrático medio (MSE): El MSE de 3558.03 puede ser alto, pero necesita contexto (compararlo con otros modelos o con el rango de los datos). En general, un valor más cercano a cero es lo ideal, pero depende de la escala de los datos.
  • R² (Coeficiente de determinación): Un valor de 0.89 es bastante alto, lo que sugiere que el modelo es bastante efectivo en la predicción de las calorías. Un valor cercano a 1 indica que el modelo explica bien la variabilidad de los datos por lo tanto tiene un buen ajuste.
  • Calorías predichas: La predicción de 425.43 calorías parece ser razonable dependiendo de los valores de Duration (70) y Maxpulse (140).

Aplicando el modelo de regresion multiple:

El modelo tiene dos variables predictoras: Duration y Maxpulse.
La fórmula para predecir Calories sería:

  • Calories = β0 + β1×Duration + β2×Maxpulse

Usando los valores obtenidos del modelo:

  • β0 = −393.44345667081967 (el intercepto)
  • β1 = 5.71057461 (coeficiente de Duration)
  • β2 = 2.99381171 (coeficiente de Maxpulse)

Entonces, la fórmula para predecir las Calories es:

  • Calories = −393.44345667081967 + (5.71057461×Duration) + (2.99381171×Maxpulse)

Sustituyendo los valores:

  • Calories = −393.44345667081967 + (5.71057461×70) + (2.99381171×140)
  • Calories = −393.44345667081967 + 399.7402227+419.1296394
  • Calories = −393.44345667081967 + 818.8698621

Entonces, la predicción de Calories sería:

  • Calories = 425.42640542918033

Paso 7: Conclusión sobre la Confiabilidad del Modelo: Regresión Multiple¶

  1. El modelo de regresión múltiple es más confiable que el modelo de regresión simple, ya que el Error Cuadrático Medio (MSE) en el modelo de regresión múltiple (3558.03) es considerablemente menor que en el modelo de regresión simple (8245.55), ademas el Coeficiente de Determinación (R²) en el modelo de regresión múltiple (0.8909) es mucho más alto que en el modelo de regresión simple (0.7471).
  2. Esto implica que al incluir tanto Duration como Maxpulse en el modelo, se está logrando una mejor predicción de las calorías. Aunque la Duration tiene una correlación fuerte con Calories, el agregar Maxpulse mejora aún más el ajuste del modelo, al capturar más variabilidad en los datos.

Exportar a HTML

jupyter nbconvert --to html notebook/regresion_lineal.ipynb